const axios = require('axios')

/**
 * 使用给定的选项创建一个HTTP实例。
 *
 * @param {Object} options HTTP实例的配置选项
 * @param {string} options.baseURL 请求的基本URL
 * @param {String} options.httpsAgent API 的 HTTPS 代理
 * @param {boolean} options.needLogin 指定是否需要登录
 * @param {Function} options.getToken 用于获取令牌的函数
 * @param {boolean} options.debug 指定是否启用调试模式

 * @return {Object} HTTP实例
 */
function createHttp(options) {
  const instance = axios.create(options)

  instance.interceptors.request.use(
    async (config) => {
      const { needLogin } = config

      console.log('needLogin', needLogin)

      if (needLogin) await options.getToken(config)

      config.onSuccess = Promise.resolve
      config.onFail = (error, res) => {
        console.error(res)
        return Promise.reject(error)
      }

      if (config.debug || options.debug) {
        console.log('请求地址：', `[${config.method.toUpperCase()}]`, config.baseURL + config.url)
        console.log('URL参数：', config.params)
        console.log('提交数据：', config.data)
        console.log('Authorization：', config.headers.Authorization)
      }

      return config
    },
    (error) => {
      return Promise.reject(error)
    }
  )

  instance.interceptors.response.use(
    async (response) => {
      const { config, status, headers } = response
      const contentType = headers['content-type']

      if (status == 200) {
        const data = response.data

        if (contentType == 'image/jpeg') return data

        if (data.code == 1) {
          return data
        } else {
          return config.onFail(data.message, data)
        }
      } else {
        throw `请求失败，状态码${status}`
      }
    },
    (error) => {
      const { config, response } = error

      if (response) {
        return config.onFail(`请求失败，状态码${response.status}`)
      } else {
        if (config) {
          return config.onFail(error.message, error)
        } else {
          return Promise.reject(error)
        }
      }
    }
  )

  return instance
}

module.exports = createHttp
